package com.PTA.KeShe;
import javax.swing.*;
import java.awt.*;
//Block类的实例是模块中的方块。方块含有魔板中的全部点的引用，也能确定自己所在的点。另外，方块可以使用move()方法在魔板的点上走动；
// 方块可以根据需要决定是否绘制一幅图像在方块上（图像玩法）；方块也可以根据需要决定是否将数字显示在方块上（数字玩法）。
public class Block extends JTextField{
    Point point;            //方块所在的点
    Object object;          //方块上的图像
    Point [][] allPoint;    //全部点位置
    int index_i,index_j;    //方块在二维数组中的位置(点的索引)
    public Block(){
        setEditable(false);
        setHorizontalAlignment(JTextField.CENTER);
        setFont(new Font("Arial",Font.BOLD,16));
        setForeground(Color.blue);
    }
    public void setAtPoint(Point p){
        point=p;
    }
    public void setAllPoint(Point [][] point){
        allPoint=point;
    }
    public Point getAtPoint(){
        return point;
    }
    public void setObject(Object object){
        this.object=object;
        if(object instanceof Integer){
            Integer number=(Integer)object;
            setText(""+number.intValue());
        }
        else if(object instanceof Image){
            repaint();
        }
    }
    public Object getObject(){
        return object;
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int w=getBounds().width;
        int h=getBounds().height;
        try{
            g.drawImage((Image)object,0,0,w,h,this);
        }
        catch (Exception exp){}
    }
    public boolean move(){
        int m=-1,n=-1;
        boolean successMove=false;
        Point pStart=getAtPoint();
        findIndex(pStart,allPoint);
        //见后面的findIndex(Point p,Point[][]allpoint)方法
        for(int i = 0;i<allPoint.length;i++){     //得到空盒子的位置索引“m,n”
            for(int j = 0;j<allPoint[i].length;j++){
                if(!allPoint[i][j].isHaveBlock()){
                    m=i;
                    n=j;
                }
            }
        }
        if(Math.abs(index_i-m)+Math.abs(index_j-n)==1){
            this.setAtPoint(allPoint[m][n]);      //当方块移动到空盒子allPoint[m][n]点
            successMove=true;
            allPoint[m][n].setBlock(this);
            allPoint[m][n].setHaveBlock(true);
            pStart.setHaveBlock(false);          //设置该点没有方块
            pStart.setBlock(null);                //设置该点方块为空（空盒子）
            }
        return successMove;
    }
    private void findIndex(Point p,Point[][]allpoint){       //寻找p在allPoint中的索引位置
        for(int i = 0;i<allpoint.length;i++){
            for(int j = 0;j<allpoint[i].length;j++){
                if(p==allPoint[i][j]){
                    index_i=i;
                    index_j=j;
                    break;
                }
            }
        }

    }
}
